'''自制的秘密文件处理脚本.说明书见目录下的SecretNote使用说明书.txt
  StringCrypt.py是我自己写的字符串处理类.这里只用了AESCrypt,AESDecrypt方法.'''

import sys
import subprocess
import getpass

import StringCrypt

## 参数定义
#NOTE_SHELL = r'D:\software\NotepadPlus2cn\notepad++.exe'
NOTE_SHELL = r'D:\software\UltraEdit_x64绿色特别版\uedit64.exe'
## 数据包,包括密码,明文字符串,密文字符串,外部程序,编辑文件名,临时解密文件名
data = {'key':None,'decryptString':None,'cryptString':None,
    'shell':NOTE_SHELL,'editFile':None,'tempFile':None}
## 加密解密器
sc = StringCrypt.StringCrypt()
## 是否显示密码
snShow = False

## 开始正式脚本

# 参数检查
if len(sys.argv) == 1:
    input('没有要打开的文件,按回车退出!')
    sys.exit(0)
else:
    #记录要编辑的文件与解密后的临时文件
    data['editFile'] = sys.argv[1]
    data['tempFile'] = sys.path[0]+'\\decrypt\\'+sys.argv[1].split('\\')[-1]+'.temp'
    print('解密文件为:\n'+data['editFile'])

# 输入解密密码,用getpass模块,输入不会显示也不会进退位
x = input('输入 1+回车显示密码,其他+回车不显示密码\n')
if(x == '1'):
    snShow = True
if(snShow):
    data['key'] = input('Input pass word:\n')
else:
    data['key'] = getpass.getpass('Input pass word:\n')

# 读取要编辑的文件的字节流,若解密错误,提示并退出
with open(data['editFile'],'rb') as f:
    data['cryptString'] = f.read().decode('utf-8')
    
# 把解密后的文本写入临时文件,如果加密后的文件为空,则是新文件,解密后为空字符串.
with open(data['tempFile'],'wb') as f:
    if(len(data['cryptString']) == 0):
        data['decrpytString'] = ''
    else:
        data['decrpytString'] = sc.AESDecrypt(data['cryptString'],data['key'])
    f.write(data['decrpytString'].encode('utf-8'))
    
# 外部程序打开解密文本文件
subprocess.call([data['shell'],data['tempFile']])

# 编辑完成保存后,输入命令重新加密保存,清除解密文本
while(True):
    str1 = '编辑完成后保存文件\n输入命令:y+回车,重新加密并结束脚本\n'
    str1 += '输入命令:n+回车,不保存直接退出\n'
    x = input(str1)
    if(x == 'y'):
        with open(data['tempFile'],'rb') as f:
            data['decrpytString'] = f.read().decode('utf-8')
        with open(data['editFile'],'wb') as f:
            data['cryptString'] = sc.AESCrypt(data['decrpytString'],data['key'])
            f.write(data['cryptString'].encode('utf-8'))
        with open(data['tempFile'],'w') as f:
            f.write('')
        print('保存修改,退出.')
        break
    if(x == 'n'):
        with open(data['tempFile'],'w') as f:
            f.write('')
        print('不保存修改,退出')
        break
        
# 结束
input('脚本结束,输入回车退出')
